package com.yupi.maker.generator.file;


import cn.hutool.core.io.FileUtil;
import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;


import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * 动态代码生成器
 */
public class DynamicFileGenerator {


    /**
     *
     * 动态文件生成
     * @param relativeInputPath
     * @param outputPath
     * @param model
     * @throws IOException
     * @throws TemplateException
     */
    public static void doGenerate(String relativeInputPath,String outputPath , Object model) throws IOException, TemplateException {

//       new出 Configuration 对象，参数为 FreeMarker 版本号
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_32);


//        templates/java/model       /       DataModel.java.ftl
//      指定模版所在目录
        //获取最后一个  /  位置为  基点
        int lastSplitIndex = relativeInputPath.lastIndexOf("/");
        //然后获取基础包路径    templates/java/model
        String basePackagePath = relativeInputPath.substring(0, lastSplitIndex);
        //这里获取模板文件名字
        String templateName = relativeInputPath.substring(lastSplitIndex + 1);



//      获取模板文件所属包和模板名称
        ClassTemplateLoader templateLoader = new ClassTemplateLoader(DynamicFileGenerator.class, basePackagePath);
        configuration.setTemplateLoader(templateLoader);


//      设置模板文件使用的字符集
        configuration.setDefaultEncoding("utf-8");
        configuration.setNumberFormat("0.######");


//       创建模板对象，加载指定模板
        Template template = configuration.getTemplate(templateName);

        if(!FileUtil.exist(outputPath)){
            FileUtil.touch(outputPath);
        }

//      定义生成模板所在目录
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(Paths.get(outputPath)), StandardCharsets.UTF_8));
        template.process(model,out);

        //关闭流
        out.close();
    }



    /**
     *
     *将生成模版逻辑层封装成方法，支持动态调用
     * @param inputPath
     * @param outputPath
     * @param model
     * @throws IOException
     * @throws TemplateException
     */
    public static void doGenerateByPath(String inputPath,String outputPath , Object model) throws IOException, TemplateException {

//       new出 Configuration 对象，参数为 FreeMarker 版本号
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_32);

//      指定模版所在目录
        File templateDir = new File(inputPath).getParentFile();
        configuration.setDirectoryForTemplateLoading(templateDir);


//      设置模板文件使用的字符集
        configuration.setDefaultEncoding("utf-8");
        configuration.setNumberFormat("0.######");


//       创建模板对象，加载指定模板
        String templateName = new File(inputPath).getName();
        Template template = configuration.getTemplate(templateName,"utf-8");

        if(!FileUtil.exist(outputPath)){
            FileUtil.touch(outputPath);
        }

//      定义生成模板所在目录
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(Paths.get(outputPath)), StandardCharsets.UTF_8));
        template.process(model,out);

        //关闭流
        out.close();
    }

}
